/*
 * nume: config.h
 * autor: ~T
 * descriere: modulul de configurare
 *
 * Modificari
 *   24 mai 2007 - ~T - prima versiune
 *   
 */


#ifndef CONFIG_H__
#define CONFIG_H__

#include <libxml/parser.h>
#include <libxml/tree.h>
#include <string>
#include <map>

/*
 * Clasa abstracta Configurable va trebui extinsa de fiecare modul care trebui configurat dupa un fisier XML
 */
class Configurable {
public:
    Configurable();
    virtual ~Configurable();

    /*
     * Aceasta este singura functie din interfata care
     * trebuie implementata de fiecare modul ce trebuie
     * configurat se va folosi de readConfigXML(string)
     */
    virtual bool config() =0;

protected:
    /*
     * Clasa ParameterList este o colectie (map) de parametri
     * specifici unui anumit modul
     */
    class ParameterList {
    public:
        ParameterList();
        ~ParameterList();

        /*
        * Functia va citi parametri din filepath
        */
        void readConfigXML(const std::string& filepath);

        /*
         * Functii care intorc anumite valori ale parametrilor
         * Nu exista functii publice de modificare a valorii
         * vreunui parametru din moment ce singurul mecanism
         * de configurare stabilit este prin intermediul
         * fisierului XML.
         */
        std::string get_param(const std::string& nume);

    private:
		/**
		 * print_element_names:
		 * @a_node: the initial xml node to consider.
		 *
		 * Prints (into parameters_) the names and values
		 *  of the all the xml elements
		 * that are siblings or children of a given xml node.
		 */
		void print_element_names(xmlNode * a_node);
        /*
         * Functii care permit modificarea parametrilor in
         * timpul citirii fisierului aceste functii ar trebui
         * sa fie vizibile doar din interiorul Configurable
         */
        bool set_parameter(const std::string& name,
                           const std::string& value);
        bool add_parameter(const std::string& name,
                           const std::string& value);

        std::map<std::string, std::string> parameters_;
    };

};

#endif  // CONFIG_H__
